package com.yootk.config;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

import javax.sql.DataSource;
import java.util.Map;

/**
 * 数据源动态切换
 */
public class DynamicDataSource extends AbstractRoutingDataSource {
    // 每一次不同的请求线程操作都有可能要使用到自己的DataSource
    private static final ThreadLocal<String> DATASOURCE_CONTEXT_HOLDER = new ThreadLocal<>();

    // 获取当前数据源
    @Override
    protected Object determineCurrentLookupKey() {
        return getDataSource();
    }

    // 数据源名称标记
    static interface DataSourceNames {
        String MUYAN_DATASOURCE = "muyan";      // “muyan”数据库的标记
        String YOOTK_DATASOURCE = "yootk";      // “yootk”数据库标记
    }

    // 配置项目中使用的全部数据源信息
    public DynamicDataSource(DataSource defaultTargetDataSource,
                             Map<Object, Object> targetDataSources) {
        super.setDefaultTargetDataSource(defaultTargetDataSource);  // 设置默认数据源
        super.setTargetDataSources(targetDataSources);              // 设置可以使用的全部数据源
        super.afterPropertiesSet();                                 // 配置数据源实例集合
    }

    // 设置数据源标记
    public static void setDataSource(String dataSourceName) {
        DATASOURCE_CONTEXT_HOLDER.set(dataSourceName);
    }

    // 获取数据源标记
    public static String getDataSource() {
        return DATASOURCE_CONTEXT_HOLDER.get();
    }

    // 删除数据源标记
    public static void clearDataSource() {
        DATASOURCE_CONTEXT_HOLDER.remove();
    }
}
